package com.example.demospringmybatisplus.soTokenController;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;

/**
 * sa-token用户控制层
 *
 * @author huahua
 * @DATE 2024/8/23
 **/
@RestController
@RequestMapping("/user/")
public class UserController {
    @Resource
    private JdbcTemplate jdbcTemplate;

    // 测试登录，浏览器访问： http://localhost:8086/user/doLogin?username=lisi&password=lisi
    @RequestMapping("doLogin")
    public SaResult doLogin(String username, String password) {
        List<Map<String, Object>> list =
                jdbcTemplate.queryForList("select user_id from users where user_name = ? and password = ?", username, password);
        if (list.isEmpty()) {
            return SaResult.error("用户名或密码错误");
        } else {
            StpUtil.login(list.get(0).get("user_id"));
            return SaResult.ok("登录成功");
        }
    }

    // 查询登录状态，浏览器访问： http://localhost:8086/user/isLogin
    @RequestMapping("isLogin")
    public SaResult isLogin() {
        return SaResult.ok("是否登录：" + StpUtil.isLogin());
    }

    /**
     * 查询用户信息接口，需要具备自定义的‘user-query’权限
     *
     * @return SaResult 操作结果，返回成功状态
     */
    @SaCheckPermission("user-read")
    @GetMapping("findUsers")
    public SaResult findUsers() {
        return SaResult.ok();
    }

    /**
     * 创建用户的接口，需具备‘user-write’或'write'权限之一
     * SaMode.AND, 标注一组权限，会话必须全部具有才可通过校验。
     * SaMode.OR, 标注一组权限，会话只要具有其一即可通过校验。
     *
     * @return SaResult 操作结果，返回成功状态
     */
    @SaCheckPermission(value = {"user-write", "write"}, mode = SaMode.OR)
    @GetMapping("createUser")
    public SaResult createUser() {
        /*
        // 查询权限信息 ，如果当前会话未登录，会返回一个空集合
        List<String> permissionList = StpUtil.getPermissionList();
        System.out.println("当前登录账号拥有的所有权限：" + permissionList);

        // 查询角色信息 ，如果当前会话未登录，会返回一个空集合
        List<String> roleList = StpUtil.getRoleList();
        System.out.println("当前登录账号拥有的所有角色：" + roleList);
        */
        return SaResult.ok();
    }

    /**
     * 删除用户
     * 代表需要拥有角色 admin 才可以操作
     *
     * @return SaResult 操作结果，返回成功状态
     */
    @SaCheckRole("admin")
    @GetMapping("/deleteUser")
    public SaResult deleteUser(){
        return SaResult.ok();
    }
}
